/**
 * TDS PEC 4
 * Grupo 3H2M
 *
 * El paquete <code>edu.uoc.tds.pec4.server.bbdd</code> agrupa todas las clases
 * que encapsulan los objetos de acceso a datos (DAO),para realizar el acceso
 * a datos. La base de datos es PostgreSQL.
 */
package edu.uoc.tds.pec4.server.bbdd;

import edu.uoc.tds.pec4.beans.AuditoriaDTO;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * La clase <code>AuditoriaDAO</code> es el componente de software que suministra
 * la implementación relacionada con la
 * gestión de los servicios de auditoria de movimientos de todos los subsistemas.<br />
 * Extiende la clase <code>DataBaseDAO</code><br />
 *
 * @author	Luis Rivas Mariño
 * @version	07/12/2011
 * @since	1.00
 * @see         edu.uoc.tds.pec4.server.bbdd.exceptions.DataBaseDAOException
 */
public class AuditoriaDAO extends DataBaseDAO implements IAuditoriaDAO {

    /**
     * Declaramos los PreparedStatement de las consultas a realizar
     * 
     */
    private PreparedStatement pstmtAltaAuditoria;

    /**
     * Constructor de la clase, invoca al constructor de la superclase.
     *
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    public AuditoriaDAO() throws DataBaseDAOException {

        super();

        pstmtAltaAuditoria = super.preparedStatement("INSERT INTO auditoria (objeto,sujeto,"
                + "pk,operacion) VALUES(?,?,?,?)");
    }

    /**
     * Realiza el alta de una auditoria en la base de datos.
     * @throws  DataBaseDAOException En caso de generarse una excepción de acceso
     *          a la base de datos se dispara al nivel superior
     */
    @Override
    public void altaAuditoria(AuditoriaDTO auditoria) throws DataBaseDAOException {

        if (auditoria == null) {
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_AUDITORIA_NULA);
        }

        try {
            super.setAutoCommit(false);
            pstmtAltaAuditoria.clearParameters();
            pstmtAltaAuditoria.setString(1, auditoria.getObjeto());
            pstmtAltaAuditoria.setString(2, auditoria.getSujeto());
            pstmtAltaAuditoria.setString(3, auditoria.getPk());
            pstmtAltaAuditoria.setString(4, auditoria.getOperacion());

            pstmtAltaAuditoria.execute();
            super.commit();

        } catch (SQLException SQLe) {
            super.rollback();
            throw new DataBaseDAOException(DataBaseDAOException.ERROR_ALTA_AUDITORIA
                    + Constantes.SL + SQLe.getMessage());

        } finally {
            super.setAutoCommit(true);
        }
    }
    
    /* Llama al método de la clase padre para liberar recursos
     * @see java.lang.Object#finalize() 
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
}